Load packages

library(tidyverse)
library(lehdr)
Warning: package ‘lehdr’ was built under R version 4.2.2
library(sf)
library(tmap)
library(tidycensus)
library(janitor)
library(here)
library(lubridate)

Load LODES Data

See the 2019 version of the technical document for descriptions of what the variables mean and other information: https://lehd.ces.census.gov/data/lodes/LODES7/LODESTechDoc7.4.pdf.

Three kinds of data:

Some quick examples of data codes for od:

dc_od <- grab_lodes(state ="dc", year = 2019, lodes_type = "od", job_type = "JT01", 
           segment = "S000", state_part = "aux", agg_geo = "tract",use_cache=TRUE)
Cached version of file found in C:\Users\tsyan\AppData\Local/lehdr/lehdr/Cache/dc_od_aux_JT01_2019.csv.gz
Reading now...
dc_wac <- grab_lodes(state = c("dc"), year = 2019, lodes_type = "wac", job_type = "JT00", 
           segment = "S000", state_part = "aux", agg_geo = "tract") %>% filter(state=="DC")
Downloading https://lehd.ces.census.gov/data/lodes/LODES7/dc/wac/dc_wac_S000_JT00_2019.csv.gz to C:\Users\tsyan\AppData\Local/lehdr/lehdr/Cache/dc_wac_S000_JT00_2019.csv.gz now...
Removed C:\Users\tsyan\AppData\Local/lehdr/lehdr/Cache/dc_wac_S000_JT00_2019.csv.gz.
dc_rac <- grab_lodes(state = c("dc"), year = 2019, lodes_type = "rac", job_type = "JT00", 
           segment = "S000", state_part = "aux", agg_geo = "tract") %>% filter(state=="DC")
Downloading https://lehd.ces.census.gov/data/lodes/LODES7/dc/rac/dc_rac_S000_JT00_2019.csv.gz to C:\Users\tsyan\AppData\Local/lehdr/lehdr/Cache/dc_rac_S000_JT00_2019.csv.gz now...
Removed C:\Users\tsyan\AppData\Local/lehdr/lehdr/Cache/dc_rac_S000_JT00_2019.csv.gz.

How many people work in DC? Note the difference between the two sums — # or workers vs # of workers who live in that area.

sum(dc_wac$C000)
[1] 688073
sum(dc_rac$C000)
[1] 319855

Load census data

#census_api_key("4c7e5b613afdf7d2fd6d80005f53282c9a7c1bae")
v20 = load_variables(2019,"acs5",cache=TRUE)
df_census=get_acs(geography = "tract",
                  variables=c("total_pop"="B01003_001",
                              "worker_living"="B08301_001"),
                  state="DC",geometry=TRUE,year=2019)
Getting data from the 2015-2019 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
Using FIPS code '11' for state 'DC'

  |                                                                                      
  |                                                                                |   0%
  |                                                                                      
  |=================================                                               |  41%
  |                                                                                      
  |================================================================================| 100%
df_cens=df_census %>% rename(val=estimate) %>%  
  pivot_wider(names_from = "variable",
              values_from = c("val","moe")) %>%
  clean_names()

Merge census and lodes data

By joining wac data to census data, we now have a dataframe with all the data AND the geometry by tract.

df_c = df_cens %>% left_join(dc_wac, by = c("geoid" = "w_tract"))

Skufca sample visualizations

Where do men and women work?

tmap_mode("view")
tmap mode set to interactive viewing
df_c1 = df_c %>% select(pop = val_total_pop, men = CS01, women = CS02) %>%
  mutate(ratio=women/men)
df_c1 %>% tm_shape() + 
  tm_polygons(c("pop", "men", "women"), alpha = .4)

Examine the ratio between the men and women groups rather than visualizing them separately; this is a more useful result on which to base conclusions.

df_c1 %>% tm_shape() + tm_polygons(c("ratio"), alpha = .4)

Look at racial/ethnic differences in where people work.

df_c2 = df_c %>% select(white_workers = CR01, black_workers = CR02, 
                        hispanic_workers = CT02)
df_c2 %>% tm_shape() + 
  tm_polygons(c("white_workers", "black_workers", "hispanic_workers"), alpha = .4)

My visualizations

Analyze age, income, and education level distributions.

Starting with age:

df_c3 = df_c %>% select(a29 = CA01, a3054 = CA02, a55 = CA03)

df_c3 %>% tm_shape() + tm_polygons(c("a29", "a3054", "a55"), alpha = .4)

…then income:

df_c4 = df_c %>% select(i1250 = CE01, i12513333 = CE02, i3334 = CE03)
df_c4 %>% tm_shape() + tm_polygons(c("i1250", "i12513333", "i3334"), alpha = .4)

…then education level.

df_c5 = df_c %>% select(elhs = CD01, ehs = CD02, eassoc = CD03, ebac = CD04)
df_c5 %>% tm_shape() + tm_polygons(c("elhs", "ehs", "eassoc", "ebac"), alpha = .4)
LS0tDQp0aXRsZTogIkxPREVTIERhdGEgLSBUeWxlciBZYW5rZWUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBMb2FkIHBhY2thZ2VzDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsZWhkcikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KHRpZHljZW5zdXMpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmBgYA0KDQojIyBMb2FkIExPREVTIERhdGENCg0KU2VlIHRoZSAyMDE5IHZlcnNpb24gb2YgdGhlIHRlY2huaWNhbCBkb2N1bWVudCBmb3IgZGVzY3JpcHRpb25zIG9mIHdoYXQgdGhlIHZhcmlhYmxlcyBtZWFuIGFuZCBvdGhlciBpbmZvcm1hdGlvbjogaHR0cHM6Ly9sZWhkLmNlcy5jZW5zdXMuZ292L2RhdGEvbG9kZXMvTE9ERVM3L0xPREVTVGVjaERvYzcuNC5wZGYuDQoNClRocmVlIGtpbmRzIG9mIGRhdGE6DQoNCiogIm9kIiAtIG9yaWdpbiB0byBkZXN0aW5hdGlvbiAoaW5mbyBvbiBib3RoIHJlc2lkZW5jZSBhbmQgd29ya3BsYWNlIG9mIHdvcmtlcnMpDQoqICJyYWMiIC0gcmVzaWRlbnRpYWwgaW5mb3JtYXRpb24gb2Ygd29ya2Vycw0KKiAid2FjIiAtIHdvcmtwbGFjZSBpbmZvcm1hdGlvbiBvZiB3b3JrZXJzDQoNClNvbWUgcXVpY2sgZXhhbXBsZXMgb2YgZGF0YSBjb2RlcyBmb3Igb2Q6DQoNCiogdy9yX2dlb2NvZGU6IHdvcmtwbGFjZS9yZXNpZGVudGlhbCBjZW5zdXMgYmxvY2sgY29kZXMgDQoqIFMwMDA6IHRvdGFsIG51bWJlciBvZiBqb2JzDQoqIFNBMDEtMDM6IG51bWJlciBvZiBqb2JzIGJyb2tlbiBkb3duIGJ5IGFnZSBncm91cHMNCiogU0UwMS0wMzogbnVtYmVyIG9mIGpvYnMgYnJva2VuIGRvd24gYnkgbW9udGhseSBpbmNvbWUgZ3JvdXBzDQoqIFNJMDEtMDM6IG51bWJlciBvZiBqb2JzIGJyb2tlbiBkb3duIGJ5IGluZHVzdHJ5IGdyb3Vwcw0KDQpgYGB7cn0NCmRjX29kIDwtIGdyYWJfbG9kZXMoc3RhdGUgPSJkYyIsIHllYXIgPSAyMDE5LCBsb2Rlc190eXBlID0gIm9kIiwgam9iX3R5cGUgPSAiSlQwMSIsIA0KICAgICAgICAgICBzZWdtZW50ID0gIlMwMDAiLCBzdGF0ZV9wYXJ0ID0gImF1eCIsIGFnZ19nZW8gPSAidHJhY3QiLHVzZV9jYWNoZT1UUlVFKQ0KDQpkY193YWMgPC0gZ3JhYl9sb2RlcyhzdGF0ZSA9IGMoImRjIiksIHllYXIgPSAyMDE5LCBsb2Rlc190eXBlID0gIndhYyIsIGpvYl90eXBlID0gIkpUMDAiLCANCiAgICAgICAgICAgc2VnbWVudCA9ICJTMDAwIiwgc3RhdGVfcGFydCA9ICJhdXgiLCBhZ2dfZ2VvID0gInRyYWN0IikgJT4lIGZpbHRlcihzdGF0ZT09IkRDIikNCg0KZGNfcmFjIDwtIGdyYWJfbG9kZXMoc3RhdGUgPSBjKCJkYyIpLCB5ZWFyID0gMjAxOSwgbG9kZXNfdHlwZSA9ICJyYWMiLCBqb2JfdHlwZSA9ICJKVDAwIiwgDQogICAgICAgICAgIHNlZ21lbnQgPSAiUzAwMCIsIHN0YXRlX3BhcnQgPSAiYXV4IiwgYWdnX2dlbyA9ICJ0cmFjdCIpICU+JSBmaWx0ZXIoc3RhdGU9PSJEQyIpDQpgYGANCg0KSG93IG1hbnkgcGVvcGxlIHdvcmsgaW4gREM/DQpOb3RlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzdW1zIC0tLSAjIG9yIHdvcmtlcnMgdnMgIyBvZiB3b3JrZXJzIHdobyBsaXZlIGluIHRoYXQgYXJlYS4NCg0KYGBge3J9DQpzdW0oZGNfd2FjJEMwMDApDQpzdW0oZGNfcmFjJEMwMDApDQpgYGANCg0KIyMgTG9hZCBjZW5zdXMgZGF0YQ0KDQpgYGB7cn0NCiNjZW5zdXNfYXBpX2tleSgiNGM3ZTViNjEzYWZkZjdkMmZkNmQ4MDAwNWY1MzI4MmM5YTdjMWJhZSIpDQp2MjAgPSBsb2FkX3ZhcmlhYmxlcygyMDE5LCJhY3M1IixjYWNoZT1UUlVFKQ0KZGZfY2Vuc3VzPWdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwNCiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcz1jKCJ0b3RhbF9wb3AiPSJCMDEwMDNfMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3b3JrZXJfbGl2aW5nIj0iQjA4MzAxXzAwMSIpLA0KICAgICAgICAgICAgICAgICAgc3RhdGU9IkRDIixnZW9tZXRyeT1UUlVFLHllYXI9MjAxOSkNCmBgYA0KDQpgYGB7cn0NCmRmX2NlbnM9ZGZfY2Vuc3VzICU+JSByZW5hbWUodmFsPWVzdGltYXRlKSAlPiUgIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gInZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBjKCJ2YWwiLCJtb2UiKSkgJT4lDQogIGNsZWFuX25hbWVzKCkNCmBgYA0KDQojIyBNZXJnZSBjZW5zdXMgYW5kIGxvZGVzIGRhdGENCg0KQnkgam9pbmluZyB3YWMgZGF0YSB0byBjZW5zdXMgZGF0YSwgd2Ugbm93IGhhdmUgYSBkYXRhZnJhbWUgd2l0aCBhbGwgdGhlIGRhdGEgQU5EIHRoZSBnZW9tZXRyeSBieSB0cmFjdC4NCmBgYHtyfQ0KZGZfYyA9IGRmX2NlbnMgJT4lIGxlZnRfam9pbihkY193YWMsIGJ5ID0gYygiZ2VvaWQiID0gIndfdHJhY3QiKSkNCmBgYA0KDQojIyBTa3VmY2Egc2FtcGxlIHZpc3VhbGl6YXRpb25zDQoNCldoZXJlIGRvIG1lbiBhbmQgd29tZW4gd29yaz8NCmBgYHtyfQ0KdG1hcF9tb2RlKCJ2aWV3IikNCmRmX2MxID0gZGZfYyAlPiUgc2VsZWN0KHBvcCA9IHZhbF90b3RhbF9wb3AsIG1lbiA9IENTMDEsIHdvbWVuID0gQ1MwMikgJT4lDQogIG11dGF0ZShyYXRpbz13b21lbi9tZW4pDQpkZl9jMSAlPiUgdG1fc2hhcGUoKSArIA0KICB0bV9wb2x5Z29ucyhjKCJwb3AiLCAibWVuIiwgIndvbWVuIiksIGFscGhhID0gLjQpDQpgYGANCg0KRXhhbWluZSB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgbWVuIGFuZCB3b21lbiBncm91cHMgcmF0aGVyIHRoYW4gdmlzdWFsaXppbmcgdGhlbSBzZXBhcmF0ZWx5OyB0aGlzIGlzIGEgbW9yZSB1c2VmdWwgcmVzdWx0IG9uIHdoaWNoIHRvIGJhc2UgY29uY2x1c2lvbnMuDQpgYGB7cn0NCmRmX2MxICU+JSB0bV9zaGFwZSgpICsgdG1fcG9seWdvbnMoYygicmF0aW8iKSwgYWxwaGEgPSAuNCkNCmBgYA0KDQpMb29rIGF0IHJhY2lhbC9ldGhuaWMgZGlmZmVyZW5jZXMgaW4gd2hlcmUgcGVvcGxlIHdvcmsuDQpgYGB7cn0NCmRmX2MyID0gZGZfYyAlPiUgc2VsZWN0KHdoaXRlX3dvcmtlcnMgPSBDUjAxLCBibGFja193b3JrZXJzID0gQ1IwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICBoaXNwYW5pY193b3JrZXJzID0gQ1QwMikNCmRmX2MyICU+JSB0bV9zaGFwZSgpICsgDQogIHRtX3BvbHlnb25zKGMoIndoaXRlX3dvcmtlcnMiLCAiYmxhY2tfd29ya2VycyIsICJoaXNwYW5pY193b3JrZXJzIiksIGFscGhhID0gLjQpDQpgYGANCg0KIyMgTXkgdmlzdWFsaXphdGlvbnMNCg0KQW5hbHl6ZSBhZ2UsIGluY29tZSwgYW5kIGVkdWNhdGlvbiBsZXZlbCBkaXN0cmlidXRpb25zLg0KDQpTdGFydGluZyB3aXRoIGFnZToNCmBgYHtyfQ0KZGZfYzMgPSBkZl9jICU+JSBzZWxlY3QoYTI5ID0gQ0EwMSwgYTMwNTQgPSBDQTAyLCBhNTUgPSBDQTAzKQ0KDQpkZl9jMyAlPiUgdG1fc2hhcGUoKSArIHRtX3BvbHlnb25zKGMoImEyOSIsICJhMzA1NCIsICJhNTUiKSwgYWxwaGEgPSAuNCkNCmBgYA0KDQoNCi4uLnRoZW4gaW5jb21lOg0KYGBge3J9DQpkZl9jNCA9IGRmX2MgJT4lIHNlbGVjdChpMTI1MCA9IENFMDEsIGkxMjUxMzMzMyA9IENFMDIsIGkzMzM0ID0gQ0UwMykNCmRmX2M0ICU+JSB0bV9zaGFwZSgpICsgdG1fcG9seWdvbnMoYygiaTEyNTAiLCAiaTEyNTEzMzMzIiwgImkzMzM0IiksIGFscGhhID0gLjQpDQpgYGANCg0KLi4udGhlbiBlZHVjYXRpb24gbGV2ZWwuDQpgYGB7cn0NCmRmX2M1ID0gZGZfYyAlPiUgc2VsZWN0KGVsaHMgPSBDRDAxLCBlaHMgPSBDRDAyLCBlYXNzb2MgPSBDRDAzLCBlYmFjID0gQ0QwNCkNCmRmX2M1ICU+JSB0bV9zaGFwZSgpICsgdG1fcG9seWdvbnMoYygiZWxocyIsICJlaHMiLCAiZWFzc29jIiwgImViYWMiKSwgYWxwaGEgPSAuNCkNCmBgYA0KDQo=